도메인 주도 설계(4) - 도메인 서비스

도메인 서비스

도메인 서비스(Domain Service)란?

  • 여러 값 객체, 엔티티, 애그리거트가 필요한 기능들을 모아둔 컴포넌트

    • 책에서는 값 객체, 엔티티까지만 언급(애그리거트는 아직 배우지 않아서 언급 X)
    • 값 객체, 엔티티, 애그리거트를 도메인 객체로 지칭

에그리거트(Aggregate)란 ?

에그리거트는 관련된 도메인 객체들의 그룹

도메인 서비스는 언제 사용되는가 ?

  • 도메인 객체에 들어가기 부자연스러운 동작들을 해결
  • 도메인 객체의 책임이 모호한 비즈니스 로직
  • 여러 도메인 객체가 참여하는 비즈니스 로직

도메인 서비스와 도메인 객체의 차이

“도메인 서비스는 자신의 행동을 바꿀 수 있는 인스턴스만의 값을 갖지 않는다는 점에서 값 객체나 엔티티와 다르다” - <도메인 주도 설계 철저 입문>

  • 도메인 객체는 상태를 가짐(Stateful)
  • 도메인 서비스는 상태를 가지지 않음(Stateless)

도메인 서비스의 사용 예시

  • 유저 중복 검사

    • 새로 생성된 유저가 기존의 유저와 중복되는가?
    • 단일 객체의 책임으로 보기 애매한 기능
  • 계좌 이체

    • 두 계좌 객체의 상호작용이 필요

주의점

  • 도메인 서비스의 남용 주의

    • 도메인 객체의 로직들 전부 도메인 서비스에 구현 가능
    • -> 로직을 빼앗긴 "빈혈 도메인 모델"
    • 꼭 필요한 비즈니스 로직들만 도메인 서비스에 넣을 것

기타: 도메인 서비스와 애플리케이션 서비스?

기타: 도메인 서비스와 애플리케이션 서비스?

  • 도메인 서비스는 비즈니스 로직을 수행
  • 애플리케이션 서비스는 도메인 객체, 도메인 서비스를 조합하여 애플리케이션의 기능 수행

Written by@박대성

독서와 지식관리에 관심이 많은 개발자

GitHub